package cn.me.alphamq.broker.store;

import cn.me.alphamq.common.entity.BaseMsg;
import cn.me.alphamq.common.enumeration.EventCodeEnum;
import cn.me.alphamq.common.msg.TcpMsg;
import com.alibaba.fastjson2.JSON;
import io.netty.channel.ChannelHandlerContext;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * broker 主从集群模式下主节点管理从节点 ctx 的工具
 *
 * @author f
 */
public class SlaveCtxManager {

    /**
     * 主节点中存储从节点 ctx 的映射，key：从节点的网络地址，value：从节点的 ctx
     */
    private static final Map<String, ChannelHandlerContext> slaveCtxMap = new ConcurrentHashMap<>();

    /**
     * 向所有从节点发送 同步消息 并刷新通道
     *
     * @param eventCode 消息的码值
     * @param msg       待同步的消息
     */
    public static void writeAndFlush(EventCodeEnum eventCode, BaseMsg msg) {
        TcpMsg tcpMsg = new TcpMsg(eventCode, JSON.toJSONBytes(msg));
        slaveCtxMap.values().forEach(ch -> ch.writeAndFlush(tcpMsg));
    }

    /**
     * 保存从节点与主节点的 ctx
     *
     * @param address 从节点的网络地址
     * @param ctx     从节点与主节点的 ctx
     */
    public static void put(String address, ChannelHandlerContext ctx) {
        slaveCtxMap.put(address, ctx);
    }

    /**
     * 判断映射是否为空
     *
     * @return 返回映射是否为空
     */
    public static boolean isEmpty() {
        return slaveCtxMap.isEmpty();
    }
}
